03. 分支

现在该学习强大的分支功能了!git 中的分支非常灵活,使你能够实现一些很强大的功能。在详细了解一些具体的命令之前,我们先从宏观层面了解下什么是分支以及它们的工作方式。

Nd016 WebND Ud123 Gitcourse BETAMOJITO L5 26 分支概述

这就是分支的工作原理以及如何在分支之间切换的概述。其实你已经在命令行上见过 master 分支了。因为你在第一节课进行了文件设置,因此命令行中显示了当前分支。

_终端在提示符中显示了当前分支。当前分支是"master"分支。_

终端在提示符中显示了当前分支。当前分支是"master"分支。

git branch 命令

git branch 命令用来与 git 的分支进行交互:

$ git branch

它可以用来:

  • 列出仓库中的所有分支名称

  • 创建新的分支

  • 删除分支

如果我们只输入 git branch ,则 git 将列出仓库中的分支:

_终端显示了 `git branch` 命令的输出结果,并显示了 master 分支。_

终端显示了 git branch 命令的输出结果,并显示了 master 分支。

## 创建分支

要创建分支,只需使用 git branch 并提供要创建的分支对应的名称。因此,如果你想创建一个叫做"sidebar"的分支,只需运行以下命令:

$ git branch sidebar

提示符改变了吗?

注意,仓库中有多个分支,但是提示符显示的是当前分支。

现在我们新建了"sidebar"分支,提示符会显示 sidebar 还是 master

SOLUTION: master

git checkout 命令

注意,在进行 commit 时,该 commit 将添加到当前分支上。虽然我们创建了新的 sidebar 分支,但是没有向其添加新的 commit,因为我们尚未切换到该分支。如果我们现在进行 commit 的话,该 commit 将添加到 master 分支,而不是 sidebar 分支。我们已经在演示中看到这一情况,要在分支之间进行切换,我们需要使用 git 的 checkout 命令。

$ git checkout sidebar

请务必了解该命令的工作方式。运行该命令将:

  • 从工作目录中删除 git 跟踪的所有文件和目录

    • (git 跟踪的文件存储在仓库中,因此什么也不会丢失)
  • 转到仓库,并提取分支指向的 commit 所对应的所有文件和目录

因此此命令将删除 master 分支中的 commit 引用的所有文件。它会将这些文件替换为 sidebar 分支中的 commit 引用的文件。理解这一部分十分重要,所以请务必多读几遍工作方式。

有趣的是, sidebar master 都指向同一 commit,因此当你在这两个分支之间切换时,看起来什么也没变。但是提示符现在会显示"sidebar":

_终端在提示符中显示了"sidebar"分支。_

终端在提示符中显示了"sidebar"分支。

## 日志中的分支

提示符中的分支信息很有用,但是最清晰的查看方式是查看 git log 的输出结果。就像我们需要使用 --decorate 选项来显示 git 标签一样,我们也需要该选项来显示分支。

$ git log --oneline --decorate

我的日志输出结果如下所示(你的可能不太一样,取决于你提交的 commit):

_终端显示了 `git log --oneline --decorate` 命令的输出结果。单词"HEAD"具有一个指向"sidebar"的箭头,后者是当前分支。_

终端显示了 git log --oneline --decorate 命令的输出结果。单词"HEAD"具有一个指向"sidebar"的箭头,后者是当前分支。

在上述输出中,注意我们之前见到的特殊指示符"HEAD"具有一个指向 sidebar 分支的箭头。它指向 sidebar 是因为 sidebar 分支是当前分支,现在提交的任何 commit 将添加到 sidebar 分支。

活跃分支

提示符将显示活跃分支。但这是我们对提示符进行的特殊自定义,如果你使用的是不同的计算机,判断活跃分支的最快速方式是查看 git branch 命令的输出结果。活跃分支名称旁边会显示一个星号。

_终端显示了 `git branch` 命令的输出结果。活跃分支(这里是 "sidebar"分支)旁边有一个星号。_

终端显示了 git branch 命令的输出结果。活跃分支(这里是 "sidebar"分支)旁边有一个星号。

在某一位置创建 git 分支

根据你所掌握的 git branch git tag 命令方面的知识,你认为下面的命令将有何作用?

$ git branch alt-sidebar-loc 42a69f
SOLUTION: 将创建 `alt-sidebar-loc` 分支并使其指向 SHA 为 `42a69f` 的 commit

哪个分支是活跃分支?

QUESTION:

假设 git branch 的输出如下所示:

$ git branch
  barbara
* footer-fix
  master
  richard
  sidebar
  social-icons

哪个分支是活跃分支?

SOLUTION:

NOTE: The solutions are expressed in RegEx pattern. Udacity uses these patterns to check the given answer

## 删除分支

分支用来进行开发或对项目进行修正,不会影响到项目(因为更改是在分支上进行的)。在分支上做出更改后,你可以将该分支组合到 master 分支上(这种“分支组合过程”叫做“合并”(merge),稍后将详细讲解)

合并了分支的更改后,你可能不再需要该分支了。如果你想删除分支,可以使用 -d 选项。下面的命令包含 -d 选项,告诉 git 删掉给出的分支(这里是"sidebar"分支)。

$ git branch -d sidebar

注意,无法删除当前所在的分支。因此要删除 sidebar 分支,你需要切换到 master 分支,或者创建并切换到新的分支。

删除内容让人比较紧张。但是不用担心。如果某个分支上有任何其他分支上都没有包含的 commit(也就是这个 commit 是要被删除的分支独有的),git 不会删除该分支。如果你创建了 sidebar 分支,向其添加了 commit,然后尝试使用 git branch -d sidebar 删除该分支,git 不会让你删除该分支,因为你无法删除当前所在的分支。如果你切换到 master 分支并尝试删除 sidebar 分支,git 也不会让你删除,因为 sidebar 分支上的新 commit 会丢失!要强制删除,你需要使用大写的 D 选项 - git branch -D sidebar

git branch 小结

总结下, git branch 命令用来管理 git 中的分支:

# 列出所有分支

$ git branch


# 创建新的"footer-fix"分支

$ git branch footer-fix


# 删除"footer-fix"分支

$ git branch -d footer-fix

此命令用来:

  • 列出本地分支

  • 创建新的分支

  • 删除分支

深入研究